package com.zenithmind.coding.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zenithmind.coding.pojo.entity.Contest;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 编程竞赛Mapper接口 - 遵循接口隔离原则，专门处理竞赛的数据访问
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Mapper
public interface ContestMapper extends BaseMapper<Contest> {

    /**
     * 根据状态查询竞赛列表
     * 
     * @param status 竞赛状态
     * @param limit 限制数量
     * @return 竞赛列表
     */
    List<Contest> selectByStatus(@Param("status") Integer status, @Param("limit") Integer limit);

    /**
     * 根据类型查询竞赛列表
     * 
     * @param type 竞赛类型
     * @param limit 限制数量
     * @return 竞赛列表
     */
    List<Contest> selectByType(@Param("type") Integer type, @Param("limit") Integer limit);

    /**
     * 搜索竞赛
     * 
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 竞赛列表
     */
    List<Contest> searchContests(@Param("keyword") String keyword, @Param("limit") Integer limit);

    /**
     * 获取用户参与的竞赛
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 竞赛列表
     */
    List<Contest> selectUserContests(@Param("userId") String userId, @Param("limit") Integer limit);

    /**
     * 获取正在进行的竞赛
     * 
     * @param limit 限制数量
     * @return 竞赛列表
     */
    List<Contest> selectRunningContests(@Param("limit") Integer limit);

    /**
     * 获取即将开始的竞赛
     * 
     * @param limit 限制数量
     * @return 竞赛列表
     */
    List<Contest> selectUpcomingContests(@Param("limit") Integer limit);

    /**
     * 获取已结束的竞赛
     * 
     * @param limit 限制数量
     * @return 竞赛列表
     */
    List<Contest> selectFinishedContests(@Param("limit") Integer limit);

    /**
     * 检查用户是否已参加竞赛
     * 
     * @param contestId 竞赛ID
     * @param userId 用户ID
     * @return 参与记录数
     */
    int checkUserParticipation(@Param("contestId") String contestId, @Param("userId") String userId);

    /**
     * 添加竞赛参与者
     * 
     * @param contestId 竞赛ID
     * @param userId 用户ID
     * @return 插入行数
     */
    int insertParticipant(@Param("contestId") String contestId, @Param("userId") String userId);

    /**
     * 移除竞赛参与者
     * 
     * @param contestId 竞赛ID
     * @param userId 用户ID
     * @return 删除行数
     */
    int deleteParticipant(@Param("contestId") String contestId, @Param("userId") String userId);

    /**
     * 获取竞赛参与者列表
     * 
     * @param contestId 竞赛ID
     * @param limit 限制数量
     * @return 参与者列表
     */
    List<Object> selectContestParticipants(@Param("contestId") String contestId, @Param("limit") Integer limit);

    /**
     * 获取竞赛排行榜
     * 
     * @param contestId 竞赛ID
     * @param limit 限制数量
     * @return 排行榜
     */
    List<Object> selectContestLeaderboard(@Param("contestId") String contestId, @Param("limit") Integer limit);

    /**
     * 更新竞赛状态
     * 
     * @param contestId 竞赛ID
     * @param status 新状态
     * @return 更新行数
     */
    int updateContestStatus(@Param("contestId") String contestId, @Param("status") Integer status);

    /**
     * 获取竞赛统计信息
     * 
     * @param contestId 竞赛ID
     * @return 统计信息
     */
    Object selectContestStatistics(@Param("contestId") String contestId);

    /**
     * 获取竞赛参与者数量
     * 
     * @param contestId 竞赛ID
     * @return 参与者数量
     */
    Long countContestParticipants(@Param("contestId") String contestId);

    /**
     * 获取竞赛提交数量
     * 
     * @param contestId 竞赛ID
     * @return 提交数量
     */
    Long countContestSubmissions(@Param("contestId") String contestId);

    /**
     * 获取热门竞赛
     * 
     * @param limit 限制数量
     * @return 竞赛列表
     */
    List<Contest> selectPopularContests(@Param("limit") Integer limit);

    /**
     * 获取最新竞赛
     * 
     * @param limit 限制数量
     * @return 竞赛列表
     */
    List<Contest> selectLatestContests(@Param("limit") Integer limit);

    /**
     * 批量插入竞赛
     * 
     * @param contests 竞赛列表
     * @return 插入行数
     */
    int batchInsertContests(@Param("list") List<Contest> contests);

    /**
     * 根据创建者查询竞赛
     * 
     * @param creatorId 创建者ID
     * @param limit 限制数量
     * @return 竞赛列表
     */
    List<Contest> selectByCreator(@Param("creatorId") String creatorId, @Param("limit") Integer limit);
}
